                                   KWASEK
                                 Prezentuje
                       Moje boje z CrackMe 2 by Hinte
                                      
                                      
                                      
    Cze w tym tekcie opisze, jakimi sposobami prbowaem zama CrackMe  2
by  Hinte i jak to zrobiem, e w kocu je zamaem. CrackMe to znalazo  si
na   moim  dysku  zupenie  na  pocztku  mojej  przygody  z  crackmesami   i
crackingiem.  Na  srtonie www.crackmes.prv.pl produkt ten mia  bardzo  i  to
bardzo dugo status Uncracked, a do momentu gdy na moim dysku brutal zapisa
plik  z  magiczn wartoci. Jak si pniej okazao bya to  dopiero  poowa
drogi.
    Gdy  odpaliem pierwszy raz ten progs to sobie pomylaem ze jest  bardzo
atwe  do  zamania, po prostu mylaem, e w tak maym pliczku  nie  da  si
zrobi  Crackme  nie do zamania(to byo kiedy). No dobra odpaliem  crackme
ustawiem puapke na GetWindowTextA i co Softice si zaapa, ale od razu  po
pobraniu  tekstu  z edita wywietlana jest informacja o zym  hale.  No  nic
pomylaem,  e prdzej crackme sprawdza czy jest zaadowany Softice,  i  tak
byo(int 68h). Nie bd tu opisywa jak to omin, jak nie wiesz to chyba le
trafie.  A  wic  gdy  si  z tym uporaem ponownie  ustawiem  puapk  na
GetWindowTextA i zaczem spokojnie oglda sobie kod:
W  jednym  z  bartpaku znalazem kod rdowy tego crackme, ponisze  wycinki
pochodz wanie z niego. Skoro ju bart je zrobi to poco mam si mczy, s
tu nawet komentarze:)
    
    
	xor ebp, ebp		; zeruje ebp
	cmp eax, 17		; sprawdz czy kod ma 17 znakow
	jnz bad_boy		; jesli nie pokaz info bad boy

Posiadaem  ju  tak  wiedz, z ktrej to wywnioskowaem,  e  haseko  musi
skada si z 17 znakw, a wic z tym nie miaem najmniejszych problemw.  No
dobra  w edicie zapisaem haso 17 znakowe i jechaem dalej, znalazem si  w
takim miejscu:

first_check   proc near
	add ebp, 1
	mov cl, ss:lpCode[ebp]	; pobierz 1 bajt z code
	imulcx, 18		; *18
	mov ss:lpCode[ebp], cl	; zapisz przemnozony bajt
	mov ebx, 0		; zeruj  ebx
	mov ebx, ebp		; do ebx wpisz ebp ktorego wartosc = 0
	movzx esi, lpCode[ebx]	; pobierz kolejne bajty z code(przemnozone)
        add eax, esi     	; sumuj przemnozone bajty w eax
        cmp ebp, 16
        jnz first_check
        add ebp, 1
        cmp eax, 983h    	; suma bajtow musi byc rowna pewnej stalej
	jnz bad_boy      	; inaczej bad boy :(
	ret
first_check   endp

Pamitam,  gdy  zobaczyem t procke, to od razu przystpiem do  odwracania,
czyli  do wyliczenia kodu takiego, aby spenia zaoenia algorytmu. Spisaem
sobie  ca  procke na kartk i zaczem si bawi. Zajo mi to nie  wiem  z
jakiej   przyczyny  bardzo  duo  czasu.  No,  ale  w  kocu   powsta   kod:
OLLL567890kw384Mm. Jak najszybciej skopiowaem go do Crackme i nacisnem OK,
i  co Wrong password Kurde czyby jeszcze jakie AntiSi, albo le wyliczyem
kod!!!. Wkurzyem si i skoczyem sobie w to miejsce:

	cmp eax, 983h    	; suma bajtow musi byc rowna pewnej stalej
	jnz bad_boy      	; inaczej bad boy :(
	ret

Haseko dobrze wyliczyem, poniewa suma wyniosa 983h. No to, co si  stao?
Naciskam F8 znajduje si na instrukcji ret naciskam znw F8 i co widz  kilka
kurde  cali.  Pomylaem  sobie,  e w nastpnym  Callu  znajduje  si  jaka
nastpna  procka AntiSi, ktra, mimo e haso dobre pokazuje, e  haso  jest
ze,  a  tu  co  ZONK,  no  kurde wymikem, w  nastpnym  Callu  jest  dalej
sprawdzane to nasze haseko. Ku&*x ma jaki ja byem wtedy lamcia, mogem  po
prostu zrobi r fl z i si upewni czy wszystko jest ok. Ale ju nie pamitam
czy nie znaem czego takiego czy po prostu mi si nie chciao tego zrobi. I
kupa  czasu  stracona. Sprawdzenie kodu odbywa si w 3  czciach  jedn  ju
przedstawiem, oto nastpne.

second_check  proc near
	sub ebp, 1
	xor  ss:lpCode[ebp], dl	; xor-uj kolejne  bajty(od  ostatniego)
				; seriala przez wartosc okreslajaca rozmiar 
				; seriala(17)
	mov  cl, al		; do cl zaladuj 83h(przy zalozeniu, ze 
				; first_check przeszlo siebez problemow)
	ror  ss:lpCode[ebp], cl	; rol-uj  ostatni  bajto(zxor-owany)
				; przez wartosc 83h
	add al, ss:lpCode[ebp]
	sub ah, ss:lpCode[ebp]
	mov ebx, ebp
	sub al, bl
	cmp ebp, 0
	jnz second_check
	cmp eax, 0D232h		; kolejna magiczna wartosc
	jnz bad_boy
	ret
second_check  endp

A to ostatnia cz:

third_check:
	xor ebx, ebx
	mov cl, ah
	ror eax, cl
	mov ebx, eax
	add bl, lpCode+10h
	xchgdl, dh
	mov ebp, edx
	xor ebx, dword ptr lpCode+3
	mov cl, bh
	rol ebx, cl
	and eax, dword ptr lpCode+2	;jebany and(to mj komenta)
	add eax, 42229
	add bx, ax
	xchgah, al
	mov cl, al
	shr ebx, cl
	add ebx, eax
	cmp ebx, 3AF22FE6h
	jnz bad_2nd

Gdy  to  zobaczyem to stwierdziem, e to Crackme jest chyba nie do zamania,
wszystko chyba przez ostatni cz sprawdzania kodu, w miejscu gdzie znajduje
si ten gupi AND, ktry powoduje, e ostatniego checka nie da si obrci.  I
tym  sposobem zakoczyem moj przygod z tym CrackMe. W midzy czasie amaem
inne  cudeka,  moja  wiedza  z kadym zamanym Crackmesem  podnosia  si  a
pewnego  dnia  wpad  mi  na  dysk source keygena  wykorzystujcy  bruteforcea
randomowego i tak sobie pomylaem czemu by go nie wykorzysta do amania tego
crackmesa. A wic jak najszybciej zabraem si za pisanie brutalo-keygena.  Na
pocztku  dodaem  pierwszego checka, i nacisnem przycisk generuj.  Na  moim
C400  serial pojawia si prawie natychmiast. Podniecony tym wszystkim dodaem
drugiego checka. W tym momencie serial, ktry spenia zaoenia dwch checkw
pojawia  si  ju  nie  tak szybko, ale co najwaniejsze  pojawia  si.  Gdy
dodaem  ostatniego  Calla pomylaem sobie moe za 15  minut  bd  ju  mia
wygenerowany prawidowy kod a tu co!!! Jedna wielka kupa mina godzina dwie i
nic.  Przerwaem generowanie passwordu, bo stwierdziem, e prdzej bym trafi
w  totolotka  ni znalaz poprawny kod. Mogem jeszcze stworzy brutal,  ktry
bdzie  generowa wszystkie kombinacje liter, ale ja chciaem uzyska  pass  w
miar  szybko a nie za kilka lat. No nic i tak ponownie zrezygnowaem  z  tego
produktu.  A do momentu, gdy si bardziej przyjrzaem crackme, i  sposobu,  w
jakim  sprawdza pass. A dokadniej chodzi o ostatni check. Jak mona  zauway
nie  da  si tego w ogle obrci, ale moe dao by si pocign to brutalem.
Dotychczas atakowalimy, jakby to powiedzie? Od przodu. Czyli check1, check2,
check3,  A  moe  by tak zaatakowa go od tyu, czyli check3, check2,  check1.
Zobaczcie, dlaczego by to si nam opacao: Od przodu szukany klucz rwny jest
136  bitw(Cae haso), Od tyu szukany klucz rwny jest 48 bitw,  z  tym  e
pojedynczy bajt moe znajdowa si w granicach od 0 do FF. W sumie 48 bitw to
za  mao  te  nie jest ale mona sprbowa pocign to bruteforcem.  A  wic
napisaem brutal dla ostatniego checka, ktry zapisywa co jaki czas do pliku
ostatni  sprawdzany klucz. Brutal powinien by doczony  do  tego  teksu  lub
znajdziesz  go  na  mojej  stronie  lub www.crackmes.prv.pl. Pocztkowy  klucz
ustawiem na 202020202020 (hex) i od czasu do czasu zapuszczaem brutala,  np.
w momentach, gdy caa moc procka nie bya mi a tak potrzebna (pisanie testw,
suchanie  muzy). I tu te stwierdziem, e szybko nie znajd tego klucza,  no
chyba, e kompa bym mia odpalonego 24h na dob. W midzy czasie opracowywaem
projekt  bruteforcea, ktry wysyaby na mj email znaleziony  porawny  klucz.
Oczywicie  uruchamiaby si na starcie kompa. Chciaem go umieci oczywicie
po kryjomu w jakie kafejce, poniewa tam kompy s prawie cay dzie wczone.
Ale  projekt przerwaem, poniewa pewnego dnia, uruchomiem brutala i zaczem
co  sobie  pisa.  Mino  kilka  minut i zminimalizowaem  okienko  jakiego
progsa.  Program zminimalizowa si bardzo pynnie. Co tu jest chyba nie  tak
przecie procesor powinien by ostro obciony, zawsze przy minimalizacji byy
rne  skoki.  Czyby  brutal  znalaz klucz?.  Jak  najszybciej  wszedem  do
katalogu z brutalem, patrz a tam pokaza si plik wynik.txt. Hurra udao si.
Pomylaem sobie ale wypas obrcenie tych 2 checkw to ju pryszcz. Hmm  chyba
si   myliem   nad  obrceniem  troch  si  mczyem.  Trzeba  byo   niele
nagwkowa.  Aha poprawny kluczyk to 007719737D20. Puciem dalej  brutala  i
jak si okazao pierwszy bajt czyli 00 moe si znajdowa w granicach od 00 do
FF.  Po  prostu  moe by dowolny, ale nie do koca. O tym pniej.  No  dobra
zajmijmy  si  teraz tymi dwoma checkami. We sobie jakie  dowolne  haso  ja
wybraem  sobie  Kwasek1234567890x  i  zobacz  jak  przebiega  szyfrowanie   w
pierwszym callu. Wida tam, e kady znak jest mnoony przez 18. Przyjrzyj si
teraz  tym zaszyfrowanym znakom: 46 5E D2 16 1A 86 72 84 96 A8 BA CC DE F0  02
60  70.  I co widzisz to co ja? Tak tak kady zaszyfrowany bajt nie ma  reszty
przy  podzieleniu  go  przez  2. Muszisz to koniecznie  sobie  zapamita.  To
odbywao  si  w callu1. Przyjrzyjmy si co si dzieje w Callu2. Ostatni  znak
zawsze rolowany jest przez 83h, po zatym kady znak jest xorowany przez 17.  I
teraz   jak  to  obrci?  Oczywicie  zaczynamy  od  koca,  czyli   procka2.
Wykorzystamy  tu  bruteforcea randomowgo. Czyli  robimy  tak:  losujemy  bajty
oprcz  tych  ju  znalezionych,  czyli  007719737D2  i  przepuszczamy   przez
odwrcony check2 wyglda on tak:

	mov     ebp,0                ;   poczatek procki obroconej
	mov	eax,00000d232h
_jumpek:
	mov	ebx,ebp
	add	al,bl
	mov	dx,ax
jeszcze_raz:
	add     ah,byte ptr [ebp+esi]
	sub     al,byte ptr [ebp+esi]
	mov	di,ax
	mov     cl,al
	rol     byte ptr [ebp+esi],cl
	xor     byte ptr [ebp+esi],11h

Pamitajcie o tym, e bajty po przejciu przez check1 nie mog dawa reszty  z
dzielenia  przez  2.  No wanie teraz, gdy te wylosowane  bajty  odszyfrujesz
powysz  prock to musisz sprawdzi czy gdy podzielisz je  przez 2  nie  daj
reszty  jeli  daj to wylosuj ponownie bajty i tak dalej  i  tak  dalej.  Aha
powrc tu do naszego klucza 007719737D20. Chodzi o to 00. Tu musisz zrobi to
samo  tzn. dobra taki bajt aby po przejciu przez odwrcon procke2 nie  byo
reszty z dzielenia przez 2. Jak to zrobi?, masz  tylko 255 kombinacji, moesz
strzela  lub  po  prostu da tam losowy bajt, ale przez to wyduy  si  cay
proces generowania seriala. Ja ju go znalazem jest to F6 czyli F67719737D20.
Po  zatym  co si jeszcze okazao, ot cae szyfrowanie zaley od  pierwszych
znakw,  i  to one decyduj czy nastpne bd daway reszt czy  nie.  A  wic
uwzgldniem w brutalu randomowym aby losowane bajty byy rwnie 1,2,i 3 znak
czyli x,x,F6. Wszystko si udao uzyskaem takie bajty: F4F5F67719737D jest to
7  pierwszych  zaszyfrowanych  znakw hasa  ktre  bd  ju  stae,  jeszcze
pozosta  ostatni  znak ktry musi mie warto 20h. A  wic  pozostao  tylko
losowa  9  znakw w naszym brutalu. Tak jak mylaem brucik  spokojnie  sobie
radzi  z losowaniem i prawidowe seriale uzyskiwaem w miar czsto. Pozosta
nam jeszcze  tylko pierwszy check, z ktrym to ju nie ma wikszego  problemu.
Jak  ju  moe  wspomniaem kady znak jest mnoony  przez  12h.  Ja  zrobiem
minibrutala  czyli 0*12h=pierwszybajt jeli tak to jest to  ju  znak  naszego
hasa  jeli  nie  to  zwiksz  licznik czyli  1*12=pierwszybajt.  Tak  trzeba
postpowa  z  kadym  znakiem. Jeli wszystko  jest  oki  to  otrzymasz  nasz
upragniony  pass.  Aha  bym zapomnia crackme nie przyjmuje  passwordu,  jeli
przypadkiem  zawiera  znak 0dh. Trzeba w ostatecznym  keygenie  zrobi  procke
sprawdzajc  ostateczny pass, jeli takie co si zdarzy to  trzeba  wyszuka
inny serial. Przykadowy pass: f&64*zz$}!IbFH
Polecam  zajrzenie  do  source  keygena. Mona go  troch  zoptymalizowa  np.
niepotrzebnie s losowane 17 znaki, mona wylosowa tylko 9 zn.
Podsumowujc  Crackme2 by Hinte jest dosy trudne. W sumie, gdy  zna  si  ju
rozwizanie  to  ju nie wydaje si tak trudne jak na pocztku.  Ale  mimo  to
zaliczam  go  do  niezych  Hardw,  dlatego  e  przez  2  LATA  (Na  stronie
www.crackmes.prv.pl pojawio si 19.09.2000) nikomu nie udao si zama  tego
progsa. Sam autor Crackme stwierdzi, e Crackme jest raczej uncrackedable.

Pozdrowionka:

_ShAwN_	: Gdy bym mia internet to bym zrobi jazde na rp
JuBe	: Za utworzenie fajnej storny z CrackMesami
tomkol	: Za przejcie wyej wymienionej strony
Cybult	: Za nastpnego amacza Cackmesw
WiteG	: Za to e zostawia troch Cm dla mnie


